#include <iostream>
using namespace std;
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <vector>
#include <string>

//vector<int> data;
//const string gsep = " ";
////测试子进程完成父进程交代的任务,每隔10中保存数据到不同文件当中
////
//enum
//{
//    OK = 0,
//    OPEN_FILE_ERROR
//};
//
//
//int SaveBegin()
//{
//    string name(std::to_string(time(NULL))); 
//    name += ".backup";
//    FILE* pf = fopen(name.c_str(),"w");
//    if (pf == nullptr) return OPEN_FILE_ERROR;
//    string str;
//   for (auto& d : data)
//   {
//        str += std::to_string(d);
//        str += gsep;
//   }
//    
//   fputs(str.c_str(),pf);
//
//   fclose(pf);
//
//    return OK;
//}
//
//void Save()
//{
//    //让子进程去保存
//    pid_t id = fork();
//    if (id == 0)
//    {
//        int code = SaveBegin();
//        exit(code);
//    }
//    int status;
//    pid_t w = waitpid(id,&status,0); //option = 0,代表阻塞等待
//    if (w > 0)
//    {
//        int code = WIFEXITED(status);
//        if (code)
//        {
//           printf("保存成功，exit code: %d\n", WEXITSTATUS(status)); 
//        }
//        else{
//           printf("保存失败，exit code: %d\n", WEXITSTATUS(status)); 
//        }
//    }
//}
//
//int main()
//{
//    int cnt = 1;
//    while(true)
//    {
//        data.push_back(cnt++);
//        sleep(1);
//        if (cnt % 10 == 0)
//        {
//            Save();
//        }
//    }
//    return 0;
//}


int main()
{
    pid_t id = fork();
    if (id == 0) //子进程
    {
        int cnt = 5;
        while(cnt--)
        {
            printf("我是子进程，pid: %d\n",getpid());
            sleep(1);
        }
        exit(10);
    }
    

    printf("我是父进程，我在等待子进程结束\n");
    while(1)
    {
        pid_t w = waitpid(id,nullptr,WNOHANG);
        if (w > 0)
        {
            printf("等待子进程成功，子进程退出\n");
            break;
        }
        else if(w == 0)
        {
            printf("等待子进程成功，但是子进程还没有退出\n");
        }
        else
        {
            printf("等待失败!\n");
            break;
        }
        sleep(1);
    }
    return 0;
}



//void fun()
//{
//    printf("hello Linux!\n");
//    _exit(100);
//}

//int main()
//{
//    printf("hello Linux!");
//    sleep(2);
//    _exit(10);
//    return 0;
//}


//int main()
//{
//    pid_t id = fork();
//    if (id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("我是子进程，pid: %d\n", getpid());
//            sleep(1);
//        }
//        exit(1);
//    }
//    else if(id > 0)
//    {
//        //binpid_t w = wait(nullptr);
//        int status;
//        pid_t w = waitpid(-1,&status,0);
//
//        if (w > 0)
//        {
//            printf("wait success ,process id : %d，status: %d\n",w,(status>>8)&0xFF);
//        }
//        while(1)
//        {
//            printf("我是父进程，pid: %d\n", getpid());
//            sleep(1);
//        }
//    }
//    return 0;
//}
